package jdbc01;
/**
 * 利用 PreparedStatement 做预编译 SQL 语句查询
 * PreparedStatement 接口中的方法:
 *      ResultSet executeQuery()
 *      在此 PreparedStatement 对象中执行 SQL 查询，并返回该查询生成的
        ResultSet 对象。
 * 优点:
 * 1.可以省去拼接 SQL 的繁琐
 * 2.PreparedStatement 预编译 SQL 可以防止注入:特殊字符会被转义成普通字符防注入
 */


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Scanner;
public class JDBCDemo02 {
    public static void main(String[] args) throws Exception {
        //1.利用scanner来模拟用户的输入动作
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入用户名：");
        String username = scan.next();
        System.out.println("请输入密码：");
        String password = scan.next();

        //2.注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        //3.获取一个连接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test02?useSSL=false&characterEncoding=UTF-8",
                "root", "root");

        //4.通过连接获取执行预编译SQL的PreparedStatement
        PreparedStatement ps = conn.prepareStatement("SELECT * FROM `user` WHERE uname = ? AND password = ?");

        //5.利用reparedStatement设置预编译SQL中？占位符的值
        ps.setString(1, username);
        ps.setString(2, password);

        System.out.println(ps);//未注入SQL:SELECT * FROM `user` WHERE uname = 'abc' AND password = ' 1\'or\'1=1 '
                               //注入SQL:SELECT * FROM `user` WHERE uname = 'abc' AND password = '1' or '1 = 1'

        //6.利用 PreparedStatement 接口中的 executeQuery()执行 SQL 语句
        ResultSet resultSet = ps.executeQuery();

        //7.遍历结果集
        while (resultSet.next()) {
            System.out.println(resultSet.getString("uname") + " " + resultSet.getString("password"));
        }

        //8.释放资源
        conn.close();
        ps.close();
        resultSet.close();
    }
}
